#pragma once

#include <mutex>
#include <condition_variable>

class WReadWriteMutex {
private:
    std::mutex _mutex;                  // 基础互斥锁
    std::condition_variable _cond;      // 条件变量（原cond_）
    int _readCount = 0;                 // 当前读操作数量（原read_count_）
    bool _writeLocked = false;          // 是否有写操作锁定（原write_locked_）

public:
    // 读锁定：多个读操作可同时持有
    void readLock() {
        std::unique_lock<std::mutex> lock(_mutex);
        // 等待写操作释放锁（无写锁时才能获取读锁）
        _cond.wait(lock, [this]() { return !_writeLocked; });
        _readCount++;
    }

    // 读解锁
    void readUnlock() {
        std::unique_lock<std::mutex> lock(_mutex);
        _readCount--;
        if (_readCount == 0) {
            // 当最后一个读操作释放锁时，通知可能等待的写操作
            _cond.notify_one();
        }
    }

    // 写锁定：独占访问，阻止其他读写操作
    void writeLock() {
        std::unique_lock<std::mutex> lock(_mutex);
        // 等待所有读操作完成且无其他写操作
        _cond.wait(lock, [this]() { return _readCount == 0 && !_writeLocked; });
        _writeLocked = true;
    }

    // 写解锁
    void writeUnlock() {
        std::unique_lock<std::mutex> lock(_mutex);
        _writeLocked = false;
        // 通知所有等待的读/写操作（写操作释放后，读和写都可能竞争）
        _cond.notify_all();
    }
};
